From b5a67fe37302e77eb1d5c389a749b40d08b62460 Mon Sep 17 00:00:00 2001 From: Matthieu Gallien Date: Fri, 25 Apr 2025 09:47:08 +0200 Subject: [PATCH] fix(filesystem): log more permissions when deleting a file fails Signed-off-by: Matthieu Gallien --- src/common/filesystembase.cpp | 30 ++++++++++++++++++++++++++++++ src/common/filesystembase.h | 1 + 2 files changed, 31 insertions(+) diff --git a/src/common/filesystembase.cpp b/src/common/filesystembase.cpp index fafd0eeba..88ace9a91 100644 --- a/src/common/filesystembase.cpp +++ b/src/common/filesystembase.cpp @@ -320,6 +320,11 @@ bool FileSystem::openAndSeekFileSharedRead(QFile *file, QString *errorOrNull, qi } #ifdef Q_OS_WIN +std::filesystem::perms FileSystem::filePermissionsWinSymlinkSafe(const QString &filename) +{ + return std::filesystem::symlink_status(filename.toStdWString()).permissions(); +} + std::filesystem::perms FileSystem::filePermissionsWin(const QString &filename) { return std::filesystem::status(filename.toStdWString()).permissions(); @@ -551,6 +556,31 @@ bool FileSystem::remove(const QString &fileName, QString *errorString) *errorString = f.errorString(); } qCWarning(lcFileSystem()) << f.errorString() << fileName; + +#if defined Q_OS_WIN + const auto permissionsDisplayHelper = [] (std::filesystem::perms currentPermissions) { + const auto unitaryHelper = [currentPermissions] (std::filesystem::perms testedPermission, char permissionChar) { + return (static_cast(currentPermissions & testedPermission) ? permissionChar : '-'); + }; + + qCInfo(lcFileSystem()) << unitaryHelper(std::filesystem::perms::owner_read, 'r') + << unitaryHelper(std::filesystem::perms::owner_write, 'w') + << unitaryHelper(std::filesystem::perms::owner_exec, 'x') + << unitaryHelper(std::filesystem::perms::group_read, 'r') + << unitaryHelper(std::filesystem::perms::group_write, 'w') + << unitaryHelper(std::filesystem::perms::group_exec, 'x') + << unitaryHelper(std::filesystem::perms::others_read, 'r') + << unitaryHelper(std::filesystem::perms::others_write, 'w') + << unitaryHelper(std::filesystem::perms::others_exec, 'x'); + }; + + const auto unsafeFilePermissions = filePermissionsWin(fileName); + permissionsDisplayHelper(unsafeFilePermissions); + + const auto safeFilePermissions = filePermissionsWinSymlinkSafe(fileName); + permissionsDisplayHelper(safeFilePermissions); +#endif + return false; } return true; diff --git a/src/common/filesystembase.h b/src/common/filesystembase.h index e9547d2d0..481e765f6 100644 --- a/src/common/filesystembase.h +++ b/src/common/filesystembase.h @@ -173,6 +173,7 @@ namespace FileSystem { */ QString OCSYNC_EXPORT pathtoUNC(const QString &str); + std::filesystem::perms OCSYNC_EXPORT filePermissionsWinSymlinkSafe(const QString &filename); std::filesystem::perms OCSYNC_EXPORT filePermissionsWin(const QString &filename); void OCSYNC_EXPORT setFilePermissionsWin(const QString &filename, const std::filesystem::perms &perms); #endif -- 2.30.2